package ifrn.agendaweb.controlador;

import ifrn.agendaweb.modelo.Compromisso;
import ifrn.agendaweb.modelo.Contato;
import ifrn.agendaweb.modelo.Usuario;
import ifrn.agendaweb.modelo.validador.ContatoValidador;
import ifrn.agendaweb.servico.ContatoServico;
import ifrn.agendaweb.servico.ServicoException;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;



@Controller
@RequestMapping("/pri/contato/**")
public class ContatoControlador {

	private ContatoServico contatoServico;
	@Autowired
	public void setContatoServico(ContatoServico contatoServico) {
		this.contatoServico = contatoServico;
	}

	/*validador*/
	@SuppressWarnings("unused")
	@Autowired
    private ContatoValidador contatoValidador;
	
	@Autowired
	Usuario usuarioSessao;
 
	@InitBinder
	protected void initBinder(WebDataBinder binder) {
		binder.setValidator(new ContatoValidador());
	}


	@RequestMapping("/index")
	public String cadastro(Model modelo) {
		modelo.addAttribute("contato", new Contato());
		return "contato.formulario";
	}

	
	@RequestMapping("/")
	public String exibir(@RequestParam("id") Integer id, Model modelo, Contato contato) {
		try {
			modelo.addAttribute("contato", contatoServico.recuperarPorId(contato, id));
			return "contato.detalhe";
		} catch (Exception pex) {
			modelo.addAttribute("erro", pex.getMessage());
			return listar(modelo);
		}
	}


	@RequestMapping(value="/criar", method=RequestMethod.POST)
	public String create(@Valid Contato contato, BindingResult result, Model modelo){
		//verifica se os campos dos formulários são válidos
		if (!result.hasFieldErrors()) {
			ModelAndView m = new ModelAndView();
			m.addObject("contato", contato);
			//cria um contato
			try {
				contato.setUsuario(usuarioSessao);
				this.contatoServico.criarContato(contato);
			}catch (ServicoException e) {
				//envia a mensagem de erro
				modelo.addAttribute("erro", e.getMessage());
				return "contato.formulario";
				}			
			return "contato.detalhe";
		} else {
			return "contato.formulario";
		}		
	}


	
	//listagem de contatos
		@RequestMapping("/listar")
		public String listar(Model modelo) {
			try {
				List<Contato> contatos = contatoServico.recuperarContato(usuarioSessao);
				modelo.addAttribute("contatos", contatos);
			} catch (Exception ex) {
				modelo.addAttribute("erro", ex.getMessage());
				// TODO: handle exception
			}			
			return "contato.listagem";	
		}

	
	//pesquisa de contatos por nome
		@RequestMapping("/pesquisar")
		public String recuperarPorNome(Model modelo, String nome /*, Usuario usuario*/) {
			try {				
				List<Contato> contatos = contatoServico.recuperarPorNome(nome, usuarioSessao);
				modelo.addAttribute("contatos", contatos);
			} catch (Exception e) {
				modelo.addAttribute("erro", e.getMessage());
			}
			return "contato.listagem";	

		}

		
		//mostra todas informa�oes do contato e as op�oes de editar e excluir
		@RequestMapping("/menucontato")
		public String getcontato(@RequestParam("id") Integer id, Model modelo, Contato contato) {
		
			try {
				modelo.addAttribute("contato", contatoServico.recuperarPorId(contato, id));
				return "contato/menucontato";
			} catch (Exception pex) {
				modelo.addAttribute("erro", pex.getMessage());
				return "contato/listar";
			}

			
		}
	
	
		@RequestMapping("/formularioAtualizar")
		public String formularioAtualizar(@RequestParam("id") Integer id, Model modelo, Contato contato) {
			try {
				contato.setId(id);
				contato = contatoServico.recuperarPorId(contato, id);
				modelo.addAttribute("contato", contato);
				return "contato.formularioAtualizar";
			} catch (Exception pex) {
				modelo.addAttribute("erro", pex.getMessage());
				return listar(modelo);
			}
		}	
		
		@RequestMapping(value="/atualizar", method=RequestMethod.POST)
		public String editado(@Valid Contato contato,  BindingResult result, Model modelo){
			//verifica se os campos dos formulários são válidos
			if (!result.hasFieldErrors()) {
				ModelAndView m = new ModelAndView();
				m.addObject("contato", contato);	
				try {
					this.contatoServico.atualizarContato(contato);
				}catch (ServicoException e) {
					//envia a mensagem de erro
					modelo.addAttribute("erro", e.getMessage());
					return "contato.formularioAtualizar";
					}
				modelo.addAttribute("sucesso", "Contato editado com sucesso.");			
				return "contato.detalhe";
			} else {
				return "contato.formularioAtualizar";
			}		
		}
				
		
		
		@RequestMapping("/excluir")
		public String excluir(@RequestParam("id") Integer idContato,
				Model modelo, Contato contato, BindingResult result) throws ServicoException{			
			
			if (!result.hasFieldErrors()) {
				try{
					contatoServico.deletarContato(contato);
					modelo.addAttribute("sucesso", "Contato excluido");					
					modelo.addAttribute("contato", contatoServico.recuperarPorId(contato, idContato));					
				} catch (Exception ex) {
					ex.printStackTrace();
					modelo.addAttribute("erro", "Ocorreu um erro durante a tentativa de exclusao.");
					return "contato.dados";
				}	
				modelo.addAttribute("sucesso", "Contato excluido");
				
				List<Contato> contatos = contatoServico.recuperarContato(usuarioSessao);
				modelo.addAttribute("contatos", contatos);				
				return "contato.listagem"; 
			} else {
				return "contato.dados";
			}
			
		}
		
		
		//listagem de compromissos
		@RequestMapping("/lista/autocomplete")
		@ResponseBody
		public List<Contato> listarAutocomplete(@RequestParam("contato") String nome) {
			try {
				return contatoServico.recuperarPorNome(nome, usuarioSessao);
			} catch (Exception ex) {
			}
			return null;	
		}
		
		
}	
	
	

	
	
	
	
	
	
	
